!function (factory) {
    "use strict";
    "function" === typeof define && define.amd ? define(["jquery", "jquery-ui"], factory) : factory(jQuery)
}(function ($) {

    var Tab = function (ele, opt) {

        this.$element = ele;
        // tab内容模板
        this.bodyTemplate = '<ul>\
                                <li><a href="#tabs-1" data-url="">{{homeLabel}}</a></li>\
                            </ul>\
                            <div id="tabs-1"></div>';
        // tab标题模板
        this.tabTemplate = "<li>\
                                <a href='{{href}}' data-url='{{url}}'>{{label}}<span class='fa fa-close' role='presentation'></span></a> \
                            </li>";

        //  默认值
        this.defaults = $.extend({}, $.fn.tabs.defaults, {
            // 首个tab的标题
            homeLabel: '首页',
            mouseDown: null
        });
        // 默认数据
        this.options = $.extend({}, this.defaults, opt || {});
    };

    Tab.prototype = {
        init: function () {
            // 基本框架
            var self = this;
            var bodyTemplate = self.bodyTemplate.replace(/{{homeLabel}}/, self.defaults.homeLabel);
            var $element = $(self.$element);
            return $element.each(function () {
                $element.append(bodyTemplate);
                // 初始化
                $element.tabs(self.options);
                // 关闭图标：当点击时移除标签页
                $element.delegate("span.fa.fa-close", "click", function (event) {
                    self._remove.call(self, $(event.currentTarget).closest('li'));
                });
                // alt + backspace 事件
                $element.tabs.bind("keyup", function (event) {
                    if (event.altKey && event.keyCode === $.ui.keyCode.BACKSPACE) {
                        self._remove.call(self, $(event.currentTarget).closest('li'));
                    }
                });
            });
        },
        // 实际的 add 函数：使用上面表单的输入添加新的标签页
        add: function (tabTitle, loadUrl, callback) {

            var $element = $(this.$element);
            var label = tabTitle || "Tab " + this.$element.xumf_tab.tabCounter,
                id = "tabs-" + this.$element.xumf_tab.tabCounter,
                li = $(this.tabTemplate.replace(/{{href}}/g, "#" + id)
                    .replace(/{{url}}/g, loadUrl)
                    .replace(/{{label}}/g, label));
            // 获取活动页面tab的标题
            var text = $element.find('.ui-tabs-active.ui-state-active').children('a').text();
            // 当前活动tab的位置
            var activeIndex = $element.find('li').index($element.find('a:contains("' + tabTitle + '")').closest('li'));
            // 是否存在此菜单
            if (this.$element.xumf_tab.tabTitleList.indexOf(tabTitle) !== -1) {
                if (text !== tabTitle) { // 当前是否为此菜单
                    // 切换菜单
                    $element.tabs("option", "active", activeIndex);
                    'function' === typeof callback && callback(id, tabTitle, loadUrl);
                }
                return;
            }
            $element.find(".ui-tabs-nav").append(li);
            $element.append(
                "<div id='" + id + "'></div>"
            );
            $element.tabs("refresh");
            // 切换菜单
            $element.tabs("option", "active", activeIndex);
            this.$element.xumf_tab.tabTitleList.push(tabTitle);
            // 回调 id 为tab对应内容div的id， tabTitle为对应tab的标题，loadUrl为对传过来的url
            'function' === typeof callback && callback(id, tabTitle, loadUrl);
            this.$element.xumf_tab.tabCounter++;
            return $element;
        },
        _remove: function (currentTarget) {
            var $target = $(currentTarget);
            var index = this.$element.xumf_tab.tabTitleList.indexOf($target.children('a').text());
            if (index === -1) return;
            this.$element.xumf_tab.tabTitleList.splice(index, 1);
            var panelId = $target.closest("li").remove().attr("aria-controls");
            $("#" + panelId).remove();
            // 刷新
            $(this.element).tabs("refresh");
            // 切换
            this.$element.tabs("option", "active", 0);
            var url = $target.data('url');
            window.location.hash = url || '';
        },
        removeTarget: function () {
            return this._remove(this.$element.xumf_tab.currentEvent.currentTarget);
        },
        removerTargetOutside: function () {
            var self = this;
            return $(this.$element).children('ul').children('li').each(function (index, item) {
                var $item = $(item);
                // 清除tab（除了当前选中之外）
                if ($item.children('a').text() !== $(self.$element.xumf_tab.currentEvent.currentTarget).children('a').text()) {
                    self._remove.call(self, item);
                }
            });
        },
        removeAll: function () {
            var self = this;
            $(this.$element).children('ul').children('li').each(function (index, item) {
                self._remove.call(self, item);
            });
        },
        onMouseDown: function (callback) {
            // 绑定鼠标点击的事件
            var self = this;
            return $(this.$element).delegate('.ui-tabs-nav>li', "mousedown", function (event) {
                self.$element.xumf_tab.currentEvent = event;
                //当点击鼠标右键，显示菜单
                if (typeof callback === 'function') {
                    if (event.button === 2) {
                        // 回调右键事件
                        callback(event, 'right');
                    } else if (event.button === 0) {
                        // 回调左键事件
                        callback(event, 'left');
                    }
                }
            });
        }
    };

    $.fn.xumf_tab = function (options) {

        var tab = new Tab(this, options);
        // 判断是否为方法
        if ("string" === typeof options) {
            // 判断方法存不存在
            if (!Tab.prototype.hasOwnProperty(options)) throw "xumf_tab - 没有这样的方法: " + options;
            // 获取参数
            var c = $.makeArray(arguments).slice(1);
            // 执行方法
            return tab[options].apply(tab, c);
        }
        // 初始化
        return tab.init();
    };

    // 总共的tab数
    $.fn.xumf_tab.tabCounter = 2;
    // tab的标题（唯一，不许重复）
    $.fn.xumf_tab.tabTitleList = [];
    // 负责记录当前的鼠标点击时间的 event对象
    $.fn.xumf_tab.currentEvent = null;

});